package com.xxjh.brs.sftp.common.utils;

import cn.hutool.extra.ftp.FtpConfig;
import cn.hutool.extra.ssh.Sftp;
import com.jcraft.jsch.ChannelSftp;
import com.xxjh.brs.sftp.common.predicate.SftpPredicate;
import com.xxjh.brs.sftp.factory.SftpProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.nio.charset.Charset;
import java.util.*;

/**
 * @author CHENCHEN
 * @title FTP工具类
 * @company 新兴际华科技（天津）有限公司
 * @create 2024-07-03 19:21
 */
public class SftpConstantsUtil {

    private static final Logger log = LoggerFactory.getLogger(SftpConstantsUtil.class);

    public static Sftp createClient(SftpProperties.SftpServer sftpServerConfig){
        FtpConfig config = new FtpConfig();
        config.setHost(sftpServerConfig.getHost());
        config.setPort(sftpServerConfig.getPort());
        config.setUser(sftpServerConfig.getUsername());
        config.setPassword(sftpServerConfig.getPassword());
        // 其他配置...
        config.setCharset(Charset.forName("UTF-8"));
        return new Sftp(config);
    }

    /**
     * 筛选并排序路径列表，确保具有最高优先级的文件路径排在前面。
     *
     * @param paths 待筛选和排序的原始文件路径列表。
     * @param sftpPredicate 自定义筛选规则。
     * @return 经过优先级筛选后的路径列表。
     */
    public static List<String> pathFilter(List<String> paths, SftpPredicate sftpPredicate) {
        Map<String, String> prefixToPath = new HashMap<>();
        for (String path : paths) {
            sftpPredicate.searchByRule(path, prefixToPath);
        }
        // 返回筛选后的路径列表
        return new ArrayList<>(prefixToPath.values());
    }

    /**
     * 在给定的FTP目录中查找是否存在tileset.json文件。
     *
     * @param entryList  获取到的FTP下文件。
     * @param directory  要检查的FTP目录路径。
     * @param sftpPredicate  断言，匹配满足自定义查找的目录和文件。
     * @return 如果找到tileset.json文件，则返回其完整路径；否则返回null。
     */
    public static Optional<String> findFileInSftpDirectory(List<ChannelSftp.LsEntry> entryList, String directory, SftpPredicate sftpPredicate) {
        for (ChannelSftp.LsEntry entry : entryList){
            if(sftpPredicate.directorySearch(entry, directory)){
                return Optional.of(directory + "/" + entry.getFilename());
            }
        }
        return Optional.empty();
    }


}
